perm filename FILNAM.SAI[VIS,HPM]2 blob sn#322314 filedate 1977-12-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY DEFFIL,FILDEF,DEVPRS,FILPRS,PRSFIL,INSWAP
C00008 ENDMK
C⊗;
ENTRY DEFFIL,FILDEF,DEVPRS,FILPRS,PRSFIL,INSWAP;
BEGIN "FILNAM"

OWN STRING DV,FN1,FN2,PRJ,PRG;

COMMENT FOR PARSING FILSPECS BETTER THAN THE SAIL SCANNER. DEFFIL ALLOWS
        DEFAULT DEV:FN1.FN2[PRJ,PRG] TO BE SET. FILDEF RETURNS CURRENT
        DEFAULTS. PRSFIL PARSES A COMPOUND FILE SPEC AND SETS DEFAULTS
        FROM DEFINED PORTIONS, FILPRS RETURNS A COMPOUND FILSPEC;

PROCEDURE DEFINIT;
IF LENGTH(PRG)=0∧LENGTH(PRJ)=0∧LENGTH(DV)=0 THEN
   BEGIN
   INTEGER PPN;
   PPN←CALL(0,"DSKPPN");
   DV←"DSK";
   PRJ←CVXSTR(PPN)[1 TO 3];
   PRG←CVXSTR(PPN)[4 TO 6];
   END;

INTERNAL PROCEDURE DEFFIL(STRING DVD,FN1D,FN2D,PRJD,PRGD);
   BEGIN
   DEFINIT;
   IF LENGTH(DVD)>0 THEN DV←DVD;
   IF LENGTH(FN1D)>0 THEN FN1←FN1D;
   IF LENGTH(FN2D)>0 THEN FN2←FN2D;
   IF LENGTH(PRJD)>0 THEN PRJ←PRJD;
   IF LENGTH(PRGD)>0 THEN PRG←PRGD;
   END;

INTERNAL PROCEDURE FILDEF(REFERENCE STRING DVD,FN1D,FN2D,PRJD,PRGD);
   BEGIN
   DEFINIT;
   DVD←DV;
   FN1D←FN1;
   FN2D←FN2;
   PRJD←PRJ;
   PRGD←PRG;
   END;

INTERNAL STRING PROCEDURE DEVPRS; RETURN(DV);

INTERNAL STRING PROCEDURE FILPRS;
   BEGIN
   DEFINIT;
   RETURN(FN1&"."&FN2&
      (IF LENGTH(PRJ)>0∧LENGTH(PRG)>0 THEN "["&PRJ&","&PRG&"]" ELSE ""));
   END;

INTERNAL PROCEDURE PRSFIL(STRING FILSPEC);
   BEGIN
   BOOLEAN LITR;
   STRING S,T;
   INTEGER I,LCNT;

   DEFINIT;
   LITR←FALSE;
   S←FILSPEC;
   T←"";
   WHILE LENGTH(S)>0 ∧ (LITR ∨ S[1 TO 1]≠":") DO
   IF S[1 TO 1]="↓" THEN
     BEGIN LITR←¬LITR; S←S[2 TO ∞] END
   ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]="	"∨S[1 TO 1]="]"∨S[1 TO 1]=",")
        THEN S←S[2 TO ∞]
   ELSE T←T&LOP(S);
   IF S[1 TO 1]=":" THEN
      BEGIN
      DV←T;
      S←S[2 TO ∞];
      FILSPEC←S;
      END
   ELSE S←FILSPEC;

   T←""; LCNT←0;
   WHILE LENGTH(S)>0 ∧ (LITR ∨ (S[1 TO 1]≠"." ∧ S[1 TO 1]≠"[")) DO
   IF S[1 TO 1]="↓" THEN
     BEGIN LITR←¬LITR; S←S[2 TO ∞]; LCNT←LCNT+1; END
   ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]="	"∨S[1 TO 1]="]"∨S[1 TO 1]=",")
        THEN S←S[2 TO ∞]
   ELSE T←T&LOP(S);
   IF LENGTH(T)>0 ∨ LCNT>0 THEN FN1←T;

   IF S[1 TO 1]="." THEN
      BEGIN
      S←S[2 TO ∞];
      T←"";
      WHILE LENGTH(S)>0 ∧ (LITR ∨ S[1 TO 1]≠"[") DO
      IF S[1 TO 1]="↓" THEN
	BEGIN LITR←¬LITR; S←S[2 TO ∞]; END
      ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]="   "∨S[1 TO 1]="]"∨S[1 TO 1]=",")
           THEN S←S[2 TO ∞]
      ELSE T←T&LOP(S);
      FN2←T;
      END;

   IF S[1 TO 1]="[" THEN
      BEGIN
      S←S[2 TO ∞];
      FILSPEC←S;
      T←""; LCNT←0;
      WHILE LENGTH(S)>0 ∧ (LITR ∨ (S[1 TO 1]≠"," ∧ S[1 TO 1]≠"]")) DO
      IF S[1 TO 1]="↓" THEN
	BEGIN LITR←¬LITR; S←S[2 TO ∞]; LCNT←LCNT+1; END
      ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]="   ") THEN S←S[2 TO ∞]
      ELSE T←T&LOP(S);
      IF LENGTH(T)>0 ∨ LCNT>0 THEN PRJ←T;
      END;

   IF S[1 TO 1]="," THEN
      BEGIN
      S←S[2 TO ∞];
      T←""; LCNT←0;
      WHILE LENGTH(S)>0 ∧ (LITR ∨ S[1 TO 1]≠"]") DO
      IF S[1 TO 1]="↓" THEN
	BEGIN LITR←¬LITR; S←S[2 TO ∞]; LCNT←LCNT+1; END
      ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]="   ") THEN S←S[2 TO ∞]
      ELSE T←T&LOP(S);
      IF LENGTH(T)>0 ∨ LCNT>0 THEN PRG←T;
      END;

   END;

   INTERNAL PROCEDURE INSWAP(STRING FILE);
      BEGIN
      INTEGER ARRAY GETADR[1:6];
      PRSFIL(FILE);
      GETADR[1]←CVSIX(DV);
      GETADR[2]←CVSIX(FN1);
      GETADR[3]←CVSIX(FN2&"   ");
      GETADR[4]←0;
      GETADR[5]←CVSIX(PRJ&PRG);
      GETADR[6]←0;
      CALL(LOCATION(GETADR[1]),"SWAP");
      END;

END;